/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.clases;

import org.joda.time.LocalTime;

/**
 * Clase hora que relaciona las horas con los medios de transporte y los trayectos.
 * @author Alejandro & David
 */
public class Hora {

    /**
     * Atributos de la clase Hora
     */
    private LocalTime horaSalida;
    private LocalTime horaLlegada;
    private InterfazMedioTransporte medioTransporte;
    private Trayecto trayecto;

    /**
     * Costructor de la clase Hora
     * @param horaSalida Hora de salida del medioTransporte en dicho trayecto de la ciudad de origen.
     * @param horaLlegada Hora de llegada del medioTransporte en dicho trayecto a la ciudad de destino.
     * @param medioTransporte medioTransporte que realiza el trayecto en la hora especificada.
     * @param trayecto Trayeto que recorre el medioTransporte en la hora especificada.
     */
    public Hora(LocalTime horaSalida, LocalTime horaLlegada, InterfazMedioTransporte medioTransporte, Trayecto trayecto){
        this.horaSalida = horaSalida;
        this.horaLlegada = horaLlegada;
        this.medioTransporte = medioTransporte;
        this.trayecto = trayecto;
        
    }
    /**
     * Constructor de la clase Hora, a partir de un objeto Hora.
     * @param hora Objeto a construir.
     */
    public Hora(Hora hora){
        this.horaLlegada = hora.horaLlegada;
        this.horaSalida = hora.horaSalida;
        this.medioTransporte = hora.medioTransporte;
        this.trayecto = hora.trayecto;
    }

    /**
     * Función que devuelve el trayecto de la instancia hora.
     * @return Devuelve el trayecto de la instancia hora.
     */
    public Trayecto obtieneTrayecto(){
        return this.trayecto;
    }

        /**
     * Función que devuelve el medioTransporte de la instancia hora.
     * @return Devuelve el medioTransporte de la instancia hora.
     */
    public InterfazMedioTransporte obtieneMedioTransporte(){
        return this.medioTransporte;
    }

    /**
     * Función que devuelve la hora de salida.
     * @return Devuelve la hora de salida.
     */
    public LocalTime obtieneHoraSalida(){
        return this.horaSalida;
    }
    /**
     * Función que compara si un objeto Hora es igual a otro.
     * @param hora Objeto hora con el que se quiere comparar.
     * @return Devuelve true si las horas son iguales o False en caso contrario.
     */
    public boolean comparaHora(Hora hora){
        return this.obtieneHoraLlegada().equals(hora.obtieneHoraLlegada()) && this.horaSalida.equals(hora.horaSalida) && this.trayecto.equals(hora.trayecto) && this.medioTransporte.equals(hora.medioTransporte);
    }
    /**
     * Función que calcula el precio de un trayecto.
     * @return El precio del trayecto para esa hora con el medioTransporte correspondiente.
     */
    public double calculaPrecio(){
        return this.trayecto.calculaPrecio(this.medioTransporte.obtienePrecio());
    }
    /**
     * Definicion del método igual, que compara la igualdad de un objeto hora con la actual.
     * @param hora objeto hora a comparar.
     * @return True si los objetos horas son iguales y False, en caso contrario.
     */
    public boolean equals(Hora hora) {
        return this.obtieneHoraLlegada().equals(hora.obtieneHoraLlegada()) && this.horaSalida.equals(hora.horaSalida) && this.trayecto.equals(hora.trayecto) && this.medioTransporte.equals(hora.medioTransporte);
    }

    /**
     * Método que devuelve la hora de llegada de un trayecto.
     * @return horaLlegada
     */
    public LocalTime obtieneHoraLlegada() {
        return this.horaLlegada;
    }

}
